﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Xml.Linq;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using System.Collections;

namespace WordTemplate1.Methodes
{
    public class SchemaWI
    {
        /// <summary>
        /// Permet de récupérer la catégorie du champs par rapport à la définition du workitem
        /// </summary>
        /// <param name="w"></param>
        /// <param name="f"></param>
        /// <returns></returns>
        public static string GetCategorie(WorkItem w, Field f)
        {
            // Récupération de la définition du Workitem             
            byte[] byteArray = Encoding.ASCII.GetBytes(w.DisplayForm);
            MemoryStream stream = new MemoryStream(byteArray);

            // Chargement de la définition dans un document XML
            XDocument xml = XDocument.Load(stream);

            try
            {
                // Recherche de la balise du champs
                var lx = xml.DescendantNodes().ToList().Where(
                    x => x.ToString().Contains(f.ReferenceName) && x.ToString().StartsWith("<Control")
                    ).ToList();

                if (lx.Count() > 0)
                {
                    string value = string.Empty;

                    // Récupération du parent qui contient l'information
                    XNode p = GetGroupOrTab(lx.First(), ref value);

                    if (!String.IsNullOrEmpty(value))
                    {
                        return value;
                    }
                }

                return Globals.ThisDocument.IdentifiantContent;
            }
            catch (Exception ex)
            {
            }
            return string.Empty;
        }

        /// <summary>
        /// Permet de récupérer le groupe ou le tab du noed pour obtenir le LABEL
        /// </summary>
        /// <param name="nx"></param>
        /// <returns></returns>
        private static XNode GetGroupOrTab(XNode nx, ref string value)
        {
            if (nx.Parent != null)
            {
                if (nx.Parent.Name == "Group")
                {
                    // Récupération de la valeur du label du noeud parent
                    if (nx.Parent.HasAttributes)
                    {
                        var LinqResult = from search in nx.Parent.Attributes()
                                where search.Name == "Label"
                                select search;

                        if (LinqResult.Count() > 0)
                        {
                            value = LinqResult.First().Value;
                            return nx.Parent;
                        }
                    }

                }
                
                if (nx.Parent.Name == "Tab")
                    return nx.Parent;
                else
                    return GetGroupOrTab(nx.Parent, ref value);
            }
            return null;
        }
    }
}
